package com.kaifamiao.listener.entity;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

/**
 * 若某个类的对象是作为 属性值 设置到 会话对象 ，
 * 比如 将 User 类的对象 设置到 会话对象中:
 *   session.setAttribute( "loginedUser" , user )
 * 如果需要监听 User 类的对象作为属性值绑定到 会话对象 的事件 或 从会话对象中解除绑定 的事件，
 * 则该类就需要实现 HttpSessionBindingListener
 */
public class User implements HttpSessionBindingListener {

    // 登录名称
    private String loginName ;
    // 登录密码
    private String password ;

    public User() {
    }

    public User(String loginName, String password) {
        this.loginName = loginName;
        this.password = password;
    }

    // 当当前类的实例作为属性值绑定到会话对象后调用 valueBound 方法
    @Override
    public void valueBound( HttpSessionBindingEvent event ) {
        HttpSession session = event.getSession();
        // 获取将 当前类的实例 绑定到会话对象时指定的 属性名
        String name = event.getName();
        // 从 会话对象中 获得 当前类的实例
        Object value = session.getAttribute( name );
        System.out.println( "为"+ name +"属性绑定值" + value );
        System.out.println( value instanceof  User );
        System.out.println( value == this );
    }

    // 当当前类的实例从会话对象中解除绑定后调用 valueUnbound 方法
    @Override
    public void valueUnbound( HttpSessionBindingEvent event ) {
        HttpSession session = event.getSession();
        // 获取将 当前类的实例 绑定到会话对象时指定的 属性名
        String name = event.getName();
        // 此时已经将 name 对应的属性 从 会话对象中移除
        System.out.println( "解除绑定" );
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
